#ifndef ADMINISTRADOR_H_
#define ADMINISTRADOR_H_
#include "Proceso.h"
#include "Caja.h"
#include "semaphore/Semaforo.h"
#include "signal/SignalHandler.h"
#include "signal/SIGINT_Handler.h"
#include "GeneradorRandom.h"
#include "MensajePeticionCaja.h"
#include "msgQueue/Cola.h"

class Administrador: public Proceso {
private:
	Caja caja; // Caja compartida donde se guarda el dinero
	Semaforo semaforoUtilizandoCaja; // Semaforo para proteger cuando se esta utilizando la caja
	Semaforo semaforoPeticionCaja;  // Semaforo donde se queda bloqueado al querer usar la caja
	const int prioridadCaja;
	Cola<MensajePeticionCaja> colaMensajesCaja;

private:
	// Obtiene el acceso a la caja, cuenta el dinero que hay y la libera
	void contarDineroCaja();

public:
	Administrador(const string& nombreProceso, bool logActivo);
	~Administrador();
	// Funcionalidad completa del administrador en el sistema
	void run();
	// Eliminar los recursos compartidos que tiene el administrador
	void eliminar();
	int getPrioridadCaja() const;
	Semaforo& getSemaforoPeticionCaja();
};

#endif /* ADMINISTRADOR_H_ */
